const foo = 'foo';
const bar = 'bar';


// -----作用域规则
// 可以访问的上层作用域在定义函数的阶段已经被确定
// 作用域链在执行函数时候创建函数执行上下文，确定作用域链


// -----什么是作用域链-------
// 作用域链，它在解释器进入到一个执行环境时初始化完成并将其分配给当前执行环境。
// 每个执行环境的作用域链由当前环境的变量对象及父级环境的作用域链构成。


// -----------什么是活动对象 ao ---------
/*
* 当函数被激活，那么一个活动对象(activation object)就会被创建并且分配给执行上下文。
* 活动对象由特殊对象 arguments 初始化而成。随后，他被当做变量对象(variable object)用于变量初始化。

*/

// _____执行上下文_____________________
/*
* 在javascript中，执行环境可以抽象的理解为一个object，它由以下几个属性构成：
* executionContext：{
    variable object：vars,functions,arguments,
    scope chain: variable object + all parents scopes
    thisValue: context object
  }

  * 当执行一个函数的时候，就会创建一个执行上下文，并且压入执行上下文栈
  * 当函数执行完毕的时候，就会将函数的执行上下文从栈中弹出。
*/

/* 作为参考--------
* 《Javascript权威指南》
  JavaScript 函数的执行用到了作用域链，这个作用域链是在函数定义的时候创建的。
  嵌套的函数 f() 定义在这个作用域链里，其中的变量 scope 一定是局部变量，不管何时何地执行函数 f()，这种绑定在执行 f() 时依然有效
*/

function fnFoo() {
  const name = 'nameFoo'
  return function (a) {
    console.log(a)
    console.log(name);
  }
}

function fnBar() {
}
console.dir(fnFoo)
console.dir(fnFoo())

setTimeout(function () {
  console.log('我是定时器的宏任务');
}, 1000)

queueMicrotask(() => {
  console.log('我是微任务')
})

